widget: Hook GTK_PHASE_TARGET controllers to the default event handlers
authorCarlos Garnacho <carlosg@gnome.org>
Sat, 10 May 2014 18:52:17 +0000 (20:52 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 23 May 2014 17:54:30 +0000 (19:54 +0200)
Just call the controllers on that phase if the default widget handlers
are run.

For compatibility reasons, in the touch event handler, let the pointer
emulating touch be transformed to a pointer event as usual, in order to
have widget handlers a chance to run at all. If they have to be managed
by a controller in that phase, it'll have to be through the default pointer
event handlers.

gtk/gtkwidget.c

index 62e43bbd0e9f9fe5493eaf66fb327f584cf33d1a..5ccd6d10d8751ba74337734f33ea85713657b5d1 100644 (file)
@@ -687,10 +687,17 @@ static gboolean gtk_widget_real_query_tooltip    (GtkWidget         *widget,
 static void     gtk_widget_real_style_updated    (GtkWidget         *widget);
 static gboolean gtk_widget_real_show_help        (GtkWidget         *widget,
                                                   GtkWidgetHelpType  help_type);
+static gboolean _gtk_widget_run_controllers      (GtkWidget           *widget,
+                                                  const GdkEvent      *event,
+                                                  GtkPropagationPhase  phase);
 
 static void    gtk_widget_dispatch_child_properties_changed    (GtkWidget        *object,
                                                                 guint             n_pspecs,
                                                                 GParamSpec      **pspecs);
+static gboolean         gtk_widget_real_button_event            (GtkWidget        *widget,
+                                                                 GdkEventButton   *event);
+static gboolean         gtk_widget_real_motion_event            (GtkWidget        *widget,
+                                                                 GdkEventMotion   *event);
 static gboolean                gtk_widget_real_key_press_event         (GtkWidget        *widget,
                                                                 GdkEventKey      *event);
 static gboolean                gtk_widget_real_key_release_event       (GtkWidget        *widget,
@@ -701,6 +708,8 @@ static gboolean             gtk_widget_real_focus_out_event         (GtkWidget        *widget,
                                                                 GdkEventFocus    *event);
 static gboolean         gtk_widget_real_touch_event             (GtkWidget        *widget,
                                                                  GdkEventTouch    *event);
+static gboolean         gtk_widget_real_grab_broken_event       (GtkWidget          *widget,
+                                                                 GdkEventGrabBroken *event);
 static gboolean                gtk_widget_real_focus                   (GtkWidget        *widget,
                                                                 GtkDirectionType  direction);
 static void             gtk_widget_real_move_focus              (GtkWidget        *widget,
@@ -1091,9 +1100,9 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->move_focus = gtk_widget_real_move_focus;
   klass->keynav_failed = gtk_widget_real_keynav_failed;
   klass->event = NULL;
-  klass->button_press_event = NULL;
-  klass->button_release_event = NULL;
-  klass->motion_notify_event = NULL;
+  klass->button_press_event = gtk_widget_real_button_event;
+  klass->button_release_event = gtk_widget_real_button_event;
+  klass->motion_notify_event = gtk_widget_real_motion_event;
   klass->touch_event = gtk_widget_real_touch_event;
   klass->delete_event = NULL;
   klass->destroy_event = NULL;
@@ -1123,7 +1132,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->drag_data_received = NULL;
   klass->screen_changed = NULL;
   klass->can_activate_accel = gtk_widget_real_can_activate_accel;
-  klass->grab_broken_event = NULL;
+  klass->grab_broken_event = gtk_widget_real_grab_broken_event;
   klass->query_tooltip = gtk_widget_real_query_tooltip;
   klass->style_updated = gtk_widget_real_style_updated;
 
@@ -7095,6 +7104,22 @@ gtk_widget_draw (GtkWidget *widget,
   _gtk_widget_draw (widget, cr);
 }
 
+static gboolean
+gtk_widget_real_button_event (GtkWidget      *widget,
+                              GdkEventButton *event)
+{
+  return _gtk_widget_run_controllers (widget, (GdkEvent *) event,
+                                      GTK_PHASE_TARGET);
+}
+
+static gboolean
+gtk_widget_real_motion_event (GtkWidget      *widget,
+                              GdkEventMotion *event)
+{
+  return _gtk_widget_run_controllers (widget, (GdkEvent *) event,
+                                      GTK_PHASE_TARGET);
+}
+
 static gboolean
 gtk_widget_real_key_press_event (GtkWidget         *widget,
                                 GdkEventKey       *event)
@@ -7136,7 +7161,8 @@ gtk_widget_real_touch_event (GtkWidget     *widget,
   gint signum;
 
   if (!event->emulating_pointer)
-    return FALSE;
+    return _gtk_widget_run_controllers (widget, (GdkEvent*) event,
+                                        GTK_PHASE_TARGET);
 
   if (event->type == GDK_TOUCH_BEGIN ||
       event->type == GDK_TOUCH_END)
@@ -7196,6 +7222,13 @@ gtk_widget_real_touch_event (GtkWidget     *widget,
   return return_val;
 }
 
+static gboolean
+gtk_widget_real_grab_broken_event (GtkWidget          *widget,
+                                   GdkEventGrabBroken *event)
+{
+  return _gtk_widget_run_controllers (widget, (GdkEvent*) event,
+                                      GTK_PHASE_TARGET);
+}
 
 #define WIDGET_REALIZED_FOR_EVENT(widget, event) \
      (event->type == GDK_FOCUS_CHANGE || gtk_widget_get_realized(widget))